#include <reg52.h>  // 包含 AT89C52 寄存器定义

// 引脚定义（与 Proteus 电路图对应）
sbit D1 = P2^0;  // 东西绿灯
sbit D2 = P2^1;  // 东西黄灯
sbit D3 = P2^2;  // 东西红灯
sbit D4 = P2^3;  // 南北绿灯
sbit D5 = P2^4;  // 南北黄灯
sbit D6 = P2^5;  // 南北红灯

// 毫秒延时函数（简单软件延时，精度不高，可用定时器优化）
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--); 
}

// 南北黄灯（D5）闪烁函数
void blink_D5(unsigned char count) {
    unsigned char i;
    for(i = 0; i < count; i++) {
        D5 = 0;  // 亮
        delay_ms(500);   
        D5 = 1;  // 灭
        delay_ms(500);   
    }
}

// 东西黄灯（D2）闪烁函数
void blink_D2(unsigned char count) {
    unsigned char i;
    for(i = 0; i < count; i++) {
        D2 = 0;  // 亮
        delay_ms(500);   
        D2 = 1;  // 灭
        delay_ms(500);   
    }
}

void main(void) {
    while(1) {  // 无限循环
        // ------------------- 阶段 1：D3(东西红)、D4(南北绿) 亮 5 秒 -------------------
        D3 = 0;  // 东西红灯亮
        D4 = 0;  // 南北绿灯亮
        // 其他灯灭
        D1 = 1;  // 东西绿灯灭
        D2 = 1;  // 东西黄灯灭
        D5 = 1;  // 南北黄灯灭
        D6 = 1;  // 南北红灯灭
        delay_ms(5000);  // 持续 5 秒

        // ------------------- 阶段 2：D4(南北绿)、D6(南北红) 灭，D5(南北黄) 闪烁 3 次，D3(东西红) 保持亮 -------------------
        D4 = 1;  // 南北绿灯灭
        D6 = 1;  // 南北红灯灭
        // 东西红灯保持亮，其他灯灭
        D1 = 1;  
        D2 = 1;  
        blink_D5(3);  // 南北黄灯闪烁 3 次

        // ------------------- 阶段 3：D1(东西绿)、D6(南北红) 亮 5 秒 -------------------
        D1 = 0;  // 东西绿灯亮
        D6 = 0;  // 南北红灯亮
        // 其他灯灭
        D2 = 1;  // 东西黄灯灭
        D3 = 1;  // 东西红灯灭
        D4 = 1;  // 南北绿灯灭
        D5 = 1;  // 南北黄灯灭
        delay_ms(5000);  // 持续 5 秒

        // ------------------- 阶段 4：D1(东西绿)、D3(东西红) 灭，D2(东西黄) 闪烁 3 次，D6(南北红) 保持亮 -------------------
        D1 = 1;  // 东西绿灯灭
        D3 = 1;  // 东西红灯灭
        // 南北红灯保持亮，其他灯灭
        D4 = 1;  
        D5 = 1;  
        blink_D2(3);  // 东西黄灯闪烁 3 次

        // 循环回到阶段 1
    }
}